import { hikvision } from "./type";
import { HikvisionBaseService } from "./base";

/** 海康事件类型码 */
export const EventCode = {
	face: {
		/** 人脸抓拍事件 */
		capture: 131614,
		/** 人脸比对事件 */
		compare: 131659,
		/** 重点目标识别 */
		focus: 1644175361,
		/** 陌生人识别事件 */
		strange: 1644171265,
		/** 高频目标识别事件 */
		highFrequency: 132865,
	},
	/** 门禁事件类型 */
	acc: {
		/** 人脸认证比对通过 */
		faceAuthOK: 196893,
		/** 人脸认证比对失败 */
		faceAuthFail: 197151,
		/** 人证比对通过 */
		cardAuthOK: 197162,
		/** 人证比对失败 */
		cardAuthFail: 197163,
		/** 人脸+刷卡认证通过 */
		faceCardAuthOK: 196890,
		/** 人脸+指纹认证通过 */
		faceFingerAuthOK: 196888,
		/** 正常开门 */
		normalOpenDoor: 198913,
		/** 正常关门 */
		normalCloseDoor: 199169,
	},
};

/**
 * 海康事件服务接口
 *
 */
export class EventService extends HikvisionBaseService {
	/** 事件类型码 */
	static EventCode = EventCode;
	/** 事件类型码 */
	EventCode = EventCode;

	/** 
     *  按事件类型订阅事件
    * 
        接口说明

        该接口用于满足应用方按事件类型码订阅事件，同一个用户重复订阅相同的事件，接口内部逻辑自动去重，确保不重复投递事件。
        事件订阅接口， 支持订阅平台的所有业务的各种事件类型，具体参考附录D
        本接口要求，三方订阅的时候，要求三方指定的http/https接收事件的服务地址。后续平台产生对应的事件，会推送到此http/https服务地址。

        接口适配产品版本

        综合安防管理平台iSecure Center V1.3及以上版本

        接口版本

        v1

        接口地址

        /api/eventService/v1/eventSubscriptionByEventTypes
     */
	async subscribeByEventType(
		params: hikvision.isc.IEventSubscriptionByEventTypesRequestParams
	) {
		const url = `${this.config.baseUrl}/api/eventService/v1/eventSubscriptionByEventTypes`;
		const data = { ...params };

		const res = await this.curl<hikvision.isc.IResponse>(url, {
			method: "POST",
			dataType: "json",
			data: data,
			contentType: "json",
			headers: {
				access_token: this.accessToken,
			},
		});

		this.handleResponseException(res, `subscribeByEventType Error`);
		return true;
	}

	/**
	 * 获取订阅事件信息
	 */
	async getSubscibeEventInfo() {
		const url = `${this.config.baseUrl}/api/eventService/v1/eventSubscriptionView`;
		const res = await this.curl<hikvision.isc.IResponse<hikvision.isc.IGetEventInfoResponse>>(
			url,
			{
				method: "POST",
				dataType: "json",
				headers: {
					access_token: this.accessToken,
				},
				rejectUnauthorized: false,
			}
		);

		this.handleResponseException(res, `getSubscibeEventInfo Error`);
		return res.data.data;
	}

	/**
	 * 取消事件订阅消息
	 *
	 */
	async unsubscribeByEventType(eventTypes: number[]) {
		const url = `${this.config.baseUrl}/api/eventService/v1/eventUnSubscriptionByEventTypes`;
		const data = { eventTypes };

		const res = await this.curl<hikvision.isc.IResponse>(url, {
			method: "POST",
			dataType: "json",
			data: data,
			contentType: "json",
			headers: {
				access_token: this.accessToken,
			},
			rejectUnauthorized: false,
		});
		this.handleResponseException(res, `unsubscribeByEventType Error`);
		return true;
	}
}
